# coding: utf-8
#!/usr/bin/python
import wx
import os


class MyFrame(wx.Frame):
    """ We simply derive a new class of Frame. """

    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, title=title, size=(200, 100))
        self.control = wx.TextCtrl(self, style=wx.TE_MULTILINE)
        self.Show(True)


# 每一个程序应该用一个菜单栏和一个状态栏。让我们添加它们到我们的程序当中：
# 注意那个wx.ID_ABOUT和wx.ID_EXIT。
# 它们是wxWidgets提供的标准ID（查看全部的ID列表）。
# 使用标准ID是一个好的习惯，如果它存在的话。这有助于让wxWidgets在不同的平台上使每一个控件的ID都看起来更加自然。
class MainWindow(wx.Frame):

    def __init__(self, parent, title):
        self.dirname = ''
        wx.Frame.__init__(self, parent, title=title, size=(200, 600))
        self.control = wx.TextCtrl(self, style=wx.TE_MULTILINE)
        self.CreateStatusBar()  # A Statusbar in the bottom of the window

        # Setting up the menu.
        filemenu = wx.Menu()

        # wx.ID_ABOUT and wx.ID_EXIT are standard IDs provided by wxWidgets.
        menuAbout = filemenu.Append(wx.ID_ABOUT, "&About",
                                    " Information about this program")
        menuOpen = filemenu.Append(wx.ID_OPEN, "&Open", "Open")
        filemenu.AppendSeparator()
        menuExit = filemenu.Append(wx.ID_EXIT, "E&xit",
                                   " Terminate the program")

        # Creating the menubar.
        menuBar = wx.MenuBar()
        menuBar.Append(filemenu,
                       "&File")  # Adding the "filemenu" to the MenuBar
        self.SetMenuBar(menuBar)  # Adding the MenuBar to the Frame content.

        # 在wxPython中，对事件的响应，称作事件处理。事件就是指发生在你的程序当中的某些事情（一个按钮被按下，文本输入，鼠标移动等等）。
        # GUI编程的很大一部分是由事件的响应组成的。你可以使用Bind()方法，将一个控件和事件绑定到一起。
        # Set events.
        self.Bind(wx.EVT_MENU, self.OnAbout, menuAbout)
        self.Bind(wx.EVT_MENU, self.OnExit, menuExit)
        self.Bind(wx.EVT_MENU, self.OnOpen, menuOpen)

        self.sizer2 = wx.BoxSizer(wx.HORIZONTAL)
        self.buttons = []
        for i in range(0, 6):
            self.buttons.append(wx.Button(self, -1, "Button &" + str(i)))
            self.sizer2.Add(self.buttons[i], 1, wx.EXPAND)

        # Use some sizers to see layout options
        self.sizer = wx.BoxSizer(wx.VERTICAL)
        self.sizer.Add(self.control, 1, wx.EXPAND)
        self.sizer.Add(self.sizer2, 0, wx.EXPAND)

        #Layout sizers
        self.SetSizer(self.sizer)
        self.SetAutoLayout(1)
        self.sizer.Fit(self)
        self.Show()

    def OnAbout(self, e):
        # A message dialog box with an OK button. wx.OK is a standard ID in wxWidgets.
        dlg = wx.MessageDialog(self, "A small text editor",
                               "About Sample Editor", wx.OK)
        dlg.ShowModal()  # Show it
        dlg.Destroy()  # finally destroy it when finished.

    def OnExit(self, e):
        self.Close(True)  # Close the frame.

    def OnOpen(self, e):
        """ Open a file"""
        dlg = wx.FileDialog(self, "Choose a file", self.dirname, "", "*.*",
                            wx.FD_OPEN)
        if dlg.ShowModal() == wx.ID_OK:
            self.filename = dlg.GetFilename()
            self.dirname = dlg.GetDirectory()
            f = open(os.path.join(self.dirname, self.filename), 'r')
            self.control.SetValue(f.read())
            f.close()
        dlg.Destroy()


class ExampleFrame(wx.Frame):

    def __init__(self, parent):
        wx.Frame.__init__(self, parent)
        panel = wx.Panel(self)
        self.quote = wx.StaticText(panel, label="Your quote: ", pos=(20, 30))
        self.Show()


app = wx.App(False)
# 每一个wxPython应用程序都是wx.App这个类的一个实例。
# 对于大多数简单的应用程序来说，你可以直接使用wx.App这个类。
# 当你需要更复杂的功能的时候，你也许就需要去扩展wx.App类。
# 参数“False”，意味着不重定向标准输出和错误输出到窗口上。
frame = MainWindow(None, 'Small editor')
ExampleFrame(None)
# wx.Frame类是一个顶层窗口。它的用法是wx.Frame(Parent, Id, Title)。
# 对于大对数的构造函数来说，都有这种通用的形式（一个父窗口名，后面紧随着它的Id）。
# 在这个例子当中，我们使用None ，来说明没用父窗口，并且使用ID_ANY，来拥有一个wxWidgets分配给我们的ID 号。

# frame.Show(True)
# 我们使一个窗口可见，通过这个函数。如果将参数改为False，你会发现程序真的在运行，但是我们看不到。
app.MainLoop()
# 最后，我们开始应用程序的MainLoop函数，它用来处理各种事件。